package com.another.common.utils.common;


import com.another.common.utils.result.ResultEnum;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * List切分工具类
 *
 * @param <E>
 * @author zhengxin
 */
public class SplitListUtil<E> {

    // 默认切分长度
    private static final int PAGE_SIZE = 1000;

    /**
     * 切分List
     *
     * @param list     原始集合
     * @param pageSize 切分后每个list中元素数量
     * @param <T> {@code T extends List<E>}
     * @return {@code List<List<E>>}
     */
    public <T extends List<E>> List<List<E>> split(T list, int pageSize) {
        if(list == null){
           throw new MyException(ResultEnum.ERROR.getCode(), "切分List失败！list为NULL");
        }
        if(pageSize < 1){
            throw new MyException(ResultEnum.ERROR.getCode(), "切分List失败！pageSize不能小于1");
        }
        int size = list.size();
        int pageCount = size % pageSize == 0 ? size / pageSize : size / pageSize + 1;

        return Stream.iterate(0, n -> n + 1).limit(pageCount).parallel().map(pageIndex ->
                list.stream().skip(pageIndex * pageSize).limit(pageSize).parallel().collect(Collectors.toList())).collect(Collectors.toList());
    }

    /**
     * 切分List 默认 pageSize=1000
     * @param list     原始集合
     * @param <T> {@code T extends List<E>}
     * @return {@code List<List<E>>}
     */
    public <T extends List<E>> List<List<E>> split(T list) {
        return this.split(list, PAGE_SIZE);
    }

}
